// UPC.js - UPC-A 条码实现（12位数字）
// 北美标准商品条码
// 参考：https://en.wikipedia.org/wiki/Universal_Product_Code

import Barcode from '../Barcode.js';
import encoder from './encoder.js';

/**
 * 计算 UPC-A 校验码
 * 规则：
 *  - 奇数位（第1,3,5,7,9,11位）×3
 *  - 偶数位（第2,4,6,8,10位）×1
 *  - 总和 mod 10，取补数
 * @param {string} number - 前11位数字
 * @returns {number} 校验码（0-9）
 */
export function checksum(number) {
	let sum = 0;

	// 奇数位（索引 0,2,4,6,8,10）×3
	for (let i = 0; i < 11; i += 2) {
		sum += parseInt(number[i], 10) * 3;
	}
	// 偶数位（索引 1,3,5,7,9）×1
	for (let i = 1; i < 11; i += 2) {
		sum += parseInt(number[i], 10);
	}

	return (10 - (sum % 10)) % 10;
}

export class UPC extends Barcode {
	/**
	 * 构造函数
	 * @param {string} data - 11 或 12 位数字
	 * @param {Object} options - 配置项
	 */
	constructor(data, options) {
		// 如果是11位数字，自动补上校验码
		if (/^[0-9]{11}$/.test(data)) {
			data += checksum(data);
		}

		super(data, options);

		this.displayValue = options.displayValue !== false; // 默认 true

		// 字体大小不能超过条码宽度的10倍（防止溢出）
		this.fontSize = Math.min(options.fontSize, options.width * 10);

		// 守卫条高度：条码高度 + 半个字体高度 + 文字边距
		this.guardHeight =
			options.height + this.fontSize / 2 + (options.textMargin || 2);
	}

	/**
	 * 验证 UPC-A 是否有效
	 * 1. 必须是12位数字
	 * 2. 最后一位必须等于 checksum(前11位)
	 * @returns {boolean}
	 */
	valid() {
		return (
			/^[0-9]{12}$/.test(this.data) &&
			parseInt(this.data[11], 10) === checksum(this.data)
		);
	}

	/**
	 * 生成编码数据
	 * @returns {Object|Array} 扁平或分段结构
	 */
	encode() {
		return this.options.flat ? this.flatEncoding() : this.guardedEncoding();
	}

	/**
	 * 扁平编码（无文本分段，仅一条二进制流）
	 * @returns {Object}
	 */
	flatEncoding() {
		let result = '';

		result += '101'; // 左守卫
		result += encoder(this.data.substr(0, 6), 'LLLLLL'); // 左侧6位（L编码）
		result += '01010'; // 中间守卫
		result += encoder(this.data.substr(6, 6), 'RRRRRR'); // 右侧6位（R编码）
		result += '101'; // 右守卫

		return {
			data: result,
			text: this.text,
		};
	}

	/**
	 * 分段编码（带文本和守卫条，用于图形渲染）
	 * @returns {Array<{ data: string, text?: string, options?: Object }>}
	 */
	guardedEncoding() {
		const result = [];

		// 显示第一位数字（左侧）
		if (this.displayValue) {
			result.push({
				data: '00000000', // 占位（不打印条码）
				text: this.text[0],
				options: {
					textAlign: 'left',
					fontSize: this.fontSize,
				},
			});
		}

		// 左守卫条 + 第一位的 L 编码
		result.push({
			data: '101' + encoder(this.data[0], 'L'),
			options: { height: this.guardHeight },
		});

		// 左侧中间5位（第2-6位）
		result.push({
			data: encoder(this.data.substr(1, 5), 'LLLLL'),
			text: this.text.substr(1, 5),
			options: { fontSize: this.fontSize },
		});

		// 中间守卫条
		result.push({
			data: '01010',
			options: { height: this.guardHeight },
		});

		// 右侧中间5位（第7-11位）
		result.push({
			data: encoder(this.data.substr(6, 5), 'RRRRR'),
			text: this.text.substr(6, 5),
			options: { fontSize: this.fontSize },
		});

		// 右守卫条 + 最后一位的 R 编码
		result.push({
			data: encoder(this.data[11], 'R') + '101',
			options: { height: this.guardHeight },
		});

		// 显示最后一位数字（右侧）
		if (this.displayValue) {
			result.push({
				data: '00000000', // 占位
				text: this.text[11],
				options: {
					textAlign: 'right',
					fontSize: this.fontSize,
				},
			});
		}

		return result;
	}
}


